/**
 * 
 */
package org.seckill.util.executor;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor.AbortPolicy;
import java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy;
import java.util.concurrent.ThreadPoolExecutor.DiscardOldestPolicy;
import java.util.concurrent.TimeUnit;

/**
 * 
 * @author yue
 * 2016年6月9日 下午6:38:32
 */
public class ThreadPoolExecutorUtil {
	
	private static ThreadPoolExecutor executor;
	/**
	 * 线程池维护线程的最少线程数,也是核心线程数,包括空闲线程
	 */
	private static int corePoolSize = 2;
	//线程池维护线程的最大线程数
	private static int maximumPoolSize =3;
	//线程池维护线程所允许的空闲时间
	private static long keepAliveTime = 300;
	//缓冲队列大小
	private static int blockingQueueSize = 3;
	
	/**
	 * 当一个任务通过execute(Runnable)方法欲添加到线程池时：
	 * 1.如果此时线程池中的数量小于corePoolSize，即使线程池中的线程都处于空闲状态，也要创建新的线程来处理被添加的任务。
	 * 2.如果此时线程池中的数量等于 corePoolSize，但是缓冲队列 workQueue未满，那么任务被放入缓冲队列。
	 * 3.如果此时线程池中的数量大于corePoolSize，缓冲队列workQueue满，并且线程池中的数量小于maximumPoolSize，
	 * 		建新的线程来处理被添加的任务。
	 * 4.如果此时线程池中的数量大于corePoolSize，缓冲队列workQueue满，并且线程池中的数量等于maximumPoolSize，
	 * 	  那么通过 handler所指定的策略来处理此任务。也就是：处理任务的优先级为：核心线程corePoolSize、任务队列workQueue、
	 * 	  最大线程 maximumPoolSize，如果三者都满了，使用handler处理被拒绝的任务。
	 */
	public synchronized static ThreadPoolExecutor getThreadPoolExecutor(){
			if(executor == null){
				//线程池所使用的缓冲队列
				BlockingQueue<Runnable> workQueue =  new ArrayBlockingQueue<Runnable>(blockingQueueSize);
				//线程池对拒绝任务的处理策略
				//CallerRunsPolicy handler = new ThreadPoolExecutor.CallerRunsPolicy();
				//AbortPolicy handler = new ThreadPoolExecutor.AbortPolicy();
				DiscardOldestPolicy handler = new ThreadPoolExecutor.DiscardOldestPolicy();
				executor = new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,TimeUnit.MILLISECONDS,workQueue,handler);
			}
			return executor;
	}
	
}
